package utils

import (
	"strconv"
	"strings"
	"time"

	"github.com/bear/wolf/config"
	"gorm.io/gorm"
)

// DateLayout 日期格式常量，统一使用YYYY-MM-DD
const DateLayout = "2006-01-02"
// 注意：Go中时间格式必须使用固定参考时间 "2006-01-02 15:04:05"（不能修改）
const DateTimeLayout = "2006-01-02 15:04:05"

// ParseDate 将YYYY-MM-DD格式的字符串解析为time.Time
func ParseDate(dateStr string) (time.Time, error) {
	// 解析日期字符串
	return time.Parse(DateLayout, dateStr)
}

// FormatDate 将time.Time格式化为YYYY-MM-DD 时分秒字符串
func FormatDate(t time.Time) string {
	return t.Format(DateLayout)
}

// FormatDateTime 将time.Time格式化为 "YYYY-MM-DD HH:MM:SS" 字符串
func FormatDateTime(t time.Time) string {
    // 如果传入的是零值时间（未初始化），返回空字符串或默认值
    if t.IsZero() {
        return ""
    }
    return t.Format(DateTimeLayout)
}

// StringToInt 将字符串转换为int，失败时返回默认值0
func StringToInt(s string) int {
    num, err := strconv.Atoi(s)
    if err != nil {
        return 0 // 转换失败返回默认值
    }
    return num
}

func Slice(s string) []int {
	// 空字符串直接返回空切片
	if s == "" {
		return nil
	}

	// 按逗号分割字符串
	parts := strings.Split(s, ",")
	var result []int

	for _, part := range parts {
		// 去除前后空格
		trimmed := strings.TrimSpace(part)
		if trimmed == "" {
			continue // 跳过空值（如 ",,6" 中的空部分）
		}

		// 转换为整数
		num, err := strconv.Atoi(trimmed)
		if err != nil {
			// 任何部分转换失败，整体返回 nil（避免部分有效但不符合预期）
			return nil
		}

		result = append(result, num)
	}

	return result
}

type TxFunc func(tx *gorm.DB) error

// 执行事务的工具函数
func WithTransaction(txFunc TxFunc) error {
    // 开启事务
    tx := config.DB.Begin()
    if tx.Error != nil {
        return tx.Error
    }

    defer func() {
        if r := recover(); r != nil {
            tx.Rollback()
        }
    }()

    // 执行事务逻辑
    if err := txFunc(tx); err != nil {
        tx.Rollback()
        return err
    }

    // 提交事务
    return tx.Commit().Error
}